<?php


/*
*  面向对象生成随机验证码   
*/

//验证码类
class Code{
   //随机因子
   public $charset="asdfghjkllzxcvbnmqwertyuiopZXCVBNMASDFGHJKLQWERTYUIOP0123456789";  //验证码库 
   public $width = '300';      //验证码边框长度
   public $height ='80';       //验证码边框高度
   public $line=20;            //随机线条
   public $snowflake=100;      //随机雪花
   public $code;               //验证码
   public $codelen=4;          //验证码长度     这里设置默认值    重新传进来的参数会覆盖原来的值      
   public $bgcolor;            //背景颜色
   public $out;                //输出图像
   public $font;               //字体
   public $fontsize=35;        //字体大小
   public $img;                //图像资源句柄


	/*
	*   构造函数   创建对象时初始化变量值
	*/

	public function __construct($codelen,$width,$height){       //可接收任何参数
	    $this->font = './FireBlock.ttf';
	    $this->codelen=$codelen;
	    $this->width=$width;
	    $this->height=$height;
	}

	//抽象类
	public function show(){
		//这里声明抽象的方法，由子类去实现该方法
		$this->_CreateImg();    //创建画布的方法
		$this->_Line();         //画线条
		$this->_Snow();         //打雪花
		$this->_Code();         //验证码
		$this->_Font();         //文字
		$this->_Out();          //输出图像

	}


	//子类，具体实现抽象类里声明的方法

	//创建画布
	public function _CreateImg(){
	    //引头文件
	    header('Content-type:image/png');
	    //创建画布
	    $this->img = imagecreatetruecolor($this->width,$this->height);   //调用Code方法里的属性用$this->
	    //设置背景颜色
	    $this->bgcolor = imagecolorallocate($this->img,200,105, 55);
	    //填充颜色
	    imagefill($this->img,0,0,$this->bgcolor);
	    
	}

	//随机生成线条
	public function _Line(){
	    for($i=0;$i<$this->line;$i++){
	    	$color = imagecolorallocate($this->img,mt_rand(0,150), mt_rand(0,150),mt_rand(0,150));
	    	imageline($this->img, mt_rand(0,$this->width),mt_rand(0,$this->height), mt_rand(0,$this->width), mt_rand(0,$this->height), $color);
	    }
	}

	//随机打雪花
	public function _Snow(){
		 for($j=0;$j<$this->snowflake;$j++){
	    	$color = imagecolorallocate($this->img,mt_rand(0,250), mt_rand(0,250),mt_rand(0,250));
	    	imagestring($this->img,mt_rand(1,5), mt_rand(0,$this->width),mt_rand(0,$this->height),'*', $color);
	    }

	}


	//随机生成验证码
	public function _Code(){
		//验证码个数
		$_len = strlen($this->charset)-1;
		for($k=0;$k<$this->codelen;$k++){
			//取出数组的元素用 []   使用方法里的局部变量直接使用 $string
			$this->code .= $this->charset[mt_rand(0,$_len)];    //这里的$_len就是局部变量
		}
	}


	//生成文字
	public function _Font(){
		//每个验证码间距
	    $_x = $this->width/$this->codelen;
	    for($x=0;$x<$this->codelen;$x++){
	    	$this->color = imagecolorallocate($this->img,mt_rand(0,155),mt_rand(0,155),mt_rand(0,155));
	    	imagefttext($this->img,$this->fontsize, mt_rand(-20,20),$_x*$x+mt_rand(1,10),$this->height/1.5,$this->color, $this->font,$this->code[$x]);
	    }
	}

	//输出图像
	public function _Out(){
		//输出
	    imagepng($this->img);
	    //释放资源
	    imagedestroy($this->img);
	}

}



//对外生成
//先实例化对象
$obj = new Code(5,400,100);  //这里可传任何参数，一一对应
//然后调用对象里的抽象类
echo $obj->show();














































